package com.liy.cloud.common.pw.service;

import com.liy.cloud.common.pw.entity.PwAccountListEntity;
import com.liy.cloud.common.pw.entity.PwAccountMainEntity;
import com.liy.cloud.common.pw.entity.PwSystemStorageEntity;
import com.das.framework.common.exception.BusinessException;
import com.das.framework.common.service.IBaseService;

import java.util.List;
import java.util.Map;

/**
 * @Author: liyang
 * @Date: 2018/6/19 16:18
 **/
public interface PwAccountMainService extends IBaseService<PwAccountMainEntity, String> {

    /**
     *
     * 功能描述:
     *      生成单据ID（accountId），车站名称缩写（比如宝安站则为BA）+“—”+业务名称缩写（短款）+4位年分（2018）+6位序号；
     *      序号从000001开始，每次加1，如果年份增加后又重新从000001开始。
     *
     * @param mainEntity
     * @author libs
     * @date   2018/7/6  20:04
     */
     String generateAccountId(PwAccountMainEntity mainEntity) throws Exception;

    /**
     *
     * 功能描述:
     *      获取默认单据ID（accountId），（车站名称缩写（比如宝安站则为BA）+“—”+业务名称缩写（短款）+4位年分（2018）+6位序号（默认设置为"######"）。
     * @param accountFirst
     *
     * @author libs
     * @date   2018/7/10  13:50
     */
    String getDefaultAccountId(String accountFirst) throws Exception;


    /**
     * @Author:  libs
     * @Date:    2018/7/13  10:12
     * @Description: 新增 出入库记录流水Bill，操作数量对应 PwAccountListEntity 中的实际数量 actNum，操作金额对应 PwAccountListEntity 中的实际金额 actMoney
     */
    void addAccountBill(PwAccountMainEntity mainEntity, PwAccountListEntity listEntity, PwSystemStorageEntity storageEntity, String operType, String inOutF) throws Exception;

    /**
     * @Author:  libs
     * @Date:    2018/7/17  14:44
     * @Description: 新增库存操作
     *
     * @Return: 返回新增的库存记录
     */
    PwSystemStorageEntity addPwSystemStorageEntity(PwAccountListEntity listEntity) throws Exception;

    /**
     * @Author:  libs
     * @Date:    2018/7/13  12:12
     * @Description: 出库操作，操作数量对应 PwAccountListEntity 中的实际数量 actNum，操作金额对应 PwAccountListEntity 中的实际金额 actMoney
     */
    void takeOutPwSystemStorage(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws Exception;

    /**
     * @Author:  libs
     * @Date:    2018/7/13  11:12
     * @Description: 入库操作，操作数量对应 PwAccountListEntity 中的实际数量 actNum，操作金额对应 PwAccountListEntity 中的实际金额 actMoney
     **/
    void putInPwSystemStorage(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws Exception;

    /**
     * @Author:  libs
     * @Date:    2018/7/23  16:59
     * @Description: 作废单据后回滚库存，出库操作
     * @params: accountId 要作废的单据编号
     */
    void invalidOutSystemStorage(String accountId) throws Exception;

    /**
     * @Author:  libs
     * @Date:    2018/7/23  17:07
     * @Description: 作废回滚库存操作，出库
     * @params: mainEntity 作废的单据编
     */
    void rollBackOutSystemStorage(PwAccountMainEntity mainEntity) throws Exception;

    /**
     * @Author:  libs
     * @Date:    2018/7/23  17:18
     * @Description: 作废单据后回滚库存，入库操作
     * @params: accountId 要作废的单据编号
     */
    public void invalidInSystemStorage(String accountId) throws Exception;

    /**
     * @Author:  libs
     * @Date:    2018/7/23  17:20
     * @Description: 作废回滚库存操作，入库
     * @params: accountId 作废的单据编
     */
    public void rollBackInSystemStorage(PwAccountMainEntity mainEntity) throws Exception;

    /**
     * @Author:  zhangw
     * @param accountId 单据编号
     * @Description: 单据编号查询
     */
    PwAccountMainEntity selectByAccountId(String accountId);

    /*
     * @Author:  liyang
     * @Date:    2018/6/28  10:00
     * @Description: 获取最新的一条记录(操作时间排序  operDate)
     * @params: systemId: 车站编号  type:单据类型
     **/
    PwAccountMainEntity getLatestEntity(String systemId, String type);

    /*
     * @Author:  liyang
     * @Date:    2018/6/28  10:00
     * @Description: 获取最新的一条记录 ( 审核时间排序 checkDate )
     * @params: systemId: 车站编号  type:单据类型
     **/
    PwAccountMainEntity getLatestEntityHasChecked(String systemId, String type);

    /*
     * @Author:  liyang
     * @Date:    2018/6/29  17:03
     * @Description: 新增 交接班
     **/
    void addHandover(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws Exception;

    /*
     * @Author:  liyang
     * @Date:    2018/6/29  19:03
     * @Description: 新增 库存调整
     **/
    void addAdjustStorage(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws Exception;

    /*
     * @Author:  liyang
     * @Date:    2018/6/29  19:03
     * @Description: 新增  车站配发车票
     **/
    void addAllocateTickets(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws Exception;

    /*
     * @Author:  liyang
     * @Date:    2018/6/28  10:00
     * @Description: 新增 车站调出车票
     **/
    void addSystemAllocateOut(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws Exception;

    /*
     * @Author:  liyang
     * @Date:    2018/6/30  18:00
     * @Description: 新增 车站调入车票
     **/
    void addSystemAllocateIn(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws Exception;

    /*
     * @Author:  liyang
     * @Date:    2018/7/12  19:08
     * @Description: 新增-上交车票:
     *
     *     上交到 车票组 需要 中心上交通知单,  则主表单的 relateId   存在
     *     上交到 收益组 不需要 中心上交通知单, 则主表单的 relateId 不存在
     **/
    void addSystemHandTickets(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws BusinessException, Exception;
    /*
     * @Author:  liyang
     * @Date:    2018/7/16  17:08
     * @Description: 新增-申请零钞:
     *
     **/
    void addApplySmallMoney(PwAccountMainEntity mainEntity, List<PwAccountListEntity> list) throws BusinessException, Exception;

    /*
     * @Author:  liyang
     * @Date:    2018/7/16  17:08
     * @Description: 新增-银行配备用金:
     *
     **/
    void addBankAllocateBackupMoney(PwAccountMainEntity mainEntity, Double backupMoney) throws Exception;

    /**
     * @Author:  libs
     * @Date:    2018/8/7  16:50
     * @Description: 查询某一天的单据信息，必传字段：审核时间checkDate
     * @params: mainEntity
     *
     *  用例: 查询特定审核时间checkDate下 某类型主单据数据
     *
     **/
    List<PwAccountMainEntity> getOneDay(PwAccountMainEntity mainEntity);

    /**
     * 返回设备票款统计
     * @return
     * @throws Exception
     */
    List<Map<String, Object>> getAccountNum() throws Exception;
}
